#pragma once
#include <unistd.h>

#include "../comm/util.hpp"

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <fcntl.h>

namespace ns_compiler
{
    class Compiler
    {
    public:
        Compiler()
        {
        }

        ~Compiler()
        {
        }

        static bool Compile(const std::string &file_name)
        {
            pid_t id = fork();
            if (id < 0)
            {
                LOG(ERROR, "create child procass fail\n");
                return false;
            }
            else if (id == 0)
            {
                umask(0);
                int fd_err = open(ns_util::PathUtil::Compile_error(file_name).c_str(), O_CREAT | O_WRONLY, 0644);
                if (fd_err < 0)
                {
                    exit(1);
                }
                dup2(fd_err, 2);

                // printf("ns_util::PathUtil::Src(file_name): %s\n", ns_util::PathUtil::Src(file_name).c_str());

                // 子进程
                execlp("g++", "g++", "-o", ns_util::PathUtil::Exe(file_name).c_str(),
                       ns_util::PathUtil::Src(file_name).c_str(), "-std=c++11", "-DCOMPILE_ONLINE", nullptr);
                LOG(ERROR, "启动g++失败\n");

                exit(1);
            }
            else
            {
                int status;
                waitpid(id, &status, 0);
                LOG(INFO, "compile sig: %d\n", status & 0x7f);

                if (ns_util::FileUtil::IsFileExists(ns_util::PathUtil::Exe(file_name)))
                {
                    LOG(INFO, "file_name: %s Compile Successfully\n", file_name.c_str());
                    return true;
                }
                else
                {
                    LOG(INFO, "file_name: %s Compile Fail\n", file_name.c_str());
                    return false;
                }
            }
        }

    private:
    };
}